package com.vecspace.middleplatform.filemanagment.service;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.vecspace.data.model.FilterColumn;
import com.vecspace.database.model.QueryResult;
import com.vecspace.exception.HException;
import com.vecspace.middleplatform.filemanagment.dao.UploadFileStorageDao;
import com.vecspace.middleplatform.filemanagment.pojo.UploadFileStorage;

public class UploadFileStorageService {

	public UploadFileStorage getUploadFileStorage(String id) throws Exception {
		return fileStorageDao.getUploadFileStorage(id);
	}

	public List<UploadFileStorage> getAllUploadFileStorages() throws Exception{
		return fileStorageDao.getAllUploadFileStorages();
	}

	/**修改或插入 文件存储路径
	 * 根据页面上放置的属性个数，需要对下面的属性设置进行调整。
	 * 对于无法在页面上进行修改的属性，不要进行设值。
	 * @param item item是由页面传递过来的对象，item中的属性并不完整，对于在页面上没有展示的属性，item中一律会是空值，而数据库中这些属性可以是有值的
	 * @return UploadFileStorage
	 * @throws Exception
	 * @reviewer 
	 */
	public UploadFileStorage saveViewUploadFileStorage(UploadFileStorage item, String loginId) throws Exception {
		UploadFileStorage item2 = changeToPersistenceUploadFileStorage(item);
		saveUploadFileStorage(item2, loginId);
		return item2;
	}

	/**将页面上传入的对象转为持久化对象（如果页面对象是一个新对象，则直接返回;否则从数据库库查询出已有的对象item2，将传入的值赋值给item2，返回item2）
	 * 修改或插入 文件存储路径
	 * 根据页面上放置的属性个数，需要对下面的属性设置进行调整。
	 * 对于无法在页面上进行修改的属性，不要进行设值。
	 * @param item item是由页面传递过来的对象，item中的属性并不完整，对于在页面上没有展示的属性，item中一律会是空值，而数据库中这些属性可以是有值的
	 * @return UploadFileStorage
	 * @throws Exception
	 * @reviewer 
	 */
	private UploadFileStorage changeToPersistenceUploadFileStorage(UploadFileStorage item) throws Exception {
		if (item == null){
			return null;
		}
		/*** 下面开始对item对象的页面传值进行校验，如必填项，格式等 ***/
		//Assert.throwz(StringUtils.isNotBlank() , "条件不满足时抛出异常");
		/*** 结束校验 ***/

		UploadFileStorage item2;
		if (!StringUtils.isEmpty(item.getId())) {
			/**从数据库中取出原始对象，将从页面传过来的新值赋值给原始对象，并将原始对象再保存到数据库中 **/
			item2 = getUploadFileStorage(item.getId());
			if (item2 != null) {
				/*** 将页面上的新值逐一赋值，不在页面上的属性不要进行赋值 ***/
				item2.setStorageName(item.getStorageName());//更新存储名称
				item2.setStoragePath(item.getStoragePath());//更新存储路径
				item2.setStorageSize(item.getStorageSize());//更新存储空间大小（MB）
				item2.setUsableStatus(item.getUsableStatus());//更新可用状态
				item2.setRemarks(item.getRemarks());//更新备注
				item2.setDisplayOrdinal(item.getDisplayOrdinal());//更新顺序号
				item2.setRecordEditFlag(item.getRecordEditFlag());//更新编辑标记

				/**end**/
			} else {
				return null;
			}
		}else{ //item是新增加的对象
			item2 = item;
		}		
		return item2;
	}

	/** 插入或修改 文件存储路径 
	 * @param item	要保存的对象
	 * @return void
	 * @throws Exception
	 * @reviewer 
	 */
	private void saveUploadFileStorage(UploadFileStorage item, String loginId) throws Exception{
		if (item == null){
			return;
		}
		/*** 下面开始对item对象进行校验，如逻辑关系等 ***/
		/*** 结束校验 ***/
		Date date = new Date();
		if (StringUtils.isEmpty(item.getId())) {
			item.setId(null);
			item.setRecordCreateUser(loginId);
			item.setRecordUpdateUser(loginId);
			item.setRecordCreateTime(date);
			item.setRecordUpdateTime(date);

		} else {
			item.setRecordUpdateUser(loginId);//设置更新时间
			item.setRecordUpdateTime(date);//设置更新时间

		}
		fileStorageDao.saveOrUpdateUploadFileStorage(item);
	}

	/** 根据ID删除 文件存储路径 
	 * @param id	主键值
	 * @return void
	 * @throws Exception
	 * @reviewer 
	 */
	public void deleteUploadFileStorage(String id) throws Exception{		
		fileStorageDao.deleteUploadFileStorage(id);
	}

	/**
	 * 根据多个查询条件执行分页查询 
	 * 
	 * @param queryFields	查询条件
	 * @param pageIndex	  页数 从1开始
	 * @param pageSize	   每页显示的数据条数,负数表示不分页
	 * @param sortField	  排序字段
	 * @param sortOrder	  排序方式 asc desc
	 * @return PageModel
	 * @throws Exception
	 * @reviewer
	 */
	public QueryResult<UploadFileStorage> getUploadFileStorageExList(List<FilterColumn> queryFields,int page, int pageSize,String sortField, String sortOrder) throws Exception{
		//设置默认分页
		page = page < 1 ? 1 : page;
		if(sortField == null || sortField.length() == 0){
			//默认排序字段
			sortField = "id";
		}
		return fileStorageDao.getUploadFileStorageExList(queryFields, page, pageSize, sortField, sortOrder);
	}

	private long fileStoragesLoadTime = 0;
	private long expriedMinllSeconds = 10 * 1000;//10秒，重新从数据库加载存储路径的时间间隔
	private List<UploadFileStorage> writableFileStorages;
	private Random random;

	/**获取一个有效的存储路径（如果有多个可用存储路径，随机返回一个）
	 * 
	 * @return
	 * @throws Exception 
	 * @author  wanghua
	 * @reviewer  
	 */
	public synchronized UploadFileStorage getUploadFileStorage() throws Exception {
		long currTime = System.currentTimeMillis();
		if((writableFileStorages==null || writableFileStorages.size() == 0) || (currTime - fileStoragesLoadTime > expriedMinllSeconds)){
			List<UploadFileStorage> fileStorages = fileStorageDao.getAllWriteableUploadFileStorages();
			for(int i=fileStorages.size()-1; i>=0; --i) {
				UploadFileStorage fileStorage = fileStorages.get(i);
				String storagePath = fileStorage.getStoragePath();
				File fileStoragePath = new File(storagePath);
				if(!fileStoragePath.exists() || !fileStoragePath.isDirectory()) {
					fileStorages.remove(i);
				}
			}
			writableFileStorages = fileStorages;
		}
		if(writableFileStorages != null && writableFileStorages.size() > 0) {
			if(writableFileStorages.size() == 1) {
				return writableFileStorages.get(0);
			}else {
				int idx = random.nextInt(writableFileStorages.size());
				return writableFileStorages.get(idx);
			}
		}else throw new HException("没有可用的存储路径");
	}

	@Autowired
	private UploadFileStorageDao fileStorageDao;
}
